package main

// 鸭子类型

import "fmt"

type QuackableAnimal interface {
	Quack()
}

type Duck struct{}

func (Duck) Quack() {
	fmt.Println("Duck quack!")
}

type Bird struct{}

func (Bird) Quack() {
	fmt.Println("Bird quack!")
}

type Dog struct{}

func (Dog) Quack() {
	fmt.Println("Dog quack!")
}

func AnimalQuackInForest(a QuackableAnimal) {
	// 每次赋值， a 中的动态类型信息都不同
	a.Quack()
}

func main() {

	animals := []QuackableAnimal{new(Duck), new(Bird), new(Dog)}
	for _, animal := range animals {
		AnimalQuackInForest(animal)
	}

}
